# 人工智能 1906A 裴云鹏


def sep(lable=''):
    '''
    Utility function to print separator lines.
    :param lable: Optional label.
    :return: None
    '''
    print('-' * 16, lable, '-' * 16, sep='')


# （一）创建funtion的源码文件, 完成以下函数：（每题5分，9 - 10
# 题每题15分共70分）
# 1、    定义一个函数my_title，实现功能：对输入的英文句子转换成标题格式，即英文句子中的每一个词汇首字母均大写。例如my_title(“what is your
# name”)时，得到‘Ｗhat Is Your Name’。
sep(1)
print('1、    定义一个函数my_title，实现功能：对输入的英文句子转换成标题格式')


def my_title(s):
    '''
    对输入的英文句子转换成标题格式
    :param s: 字符串，输入的英文句子
    :return: 转换后的字符串
    '''
    return s.title()


print(my_title('what is your name'))

# 2、    将上题中的函数my_title改为匿名函数并调用
sep(2)
print('2、    将上题中的函数my_title改为匿名函数并调用')
print((lambda s: s.title())('what is your name'))

# 3、    定义一个函数my_salary, 有参有返，根据参数（薪水）输出等级。
# 30000以上输出‘“属于金领”；
# 10000 - 30000 之间输出‘“属于白领”；
# 2000 - 10000 输出‘“属于蓝色”；
# 2000以下输出‘需要努力！’。调用这个函数
sep(3)
print('3、    定义一个函数my_salary, 有参有返，根据参数（薪水）输出等级。')


def my_salary(s):
    '''
    根据参数（薪水）输出等级
    :param s: 整数，薪水
    :return: 字符串，等级
    '''
    if s >= 30000:
        return '属于金领'
    elif s >= 10000:
        return '属于白领'
    elif s >= 2000:
        return '属于蓝色'
    else:
        return '需要努力！'


print(f'my_salary(14000) = {my_salary(14000)}')

# 4、    将上题中的函数my_salary改为无参无返函数，调用这个函数。
sep(4)
print('4、    将上题中的函数my_salary改为无参无返函数，调用这个函数。')


def my_salary2():
    '''
    根据参数（薪水）输出等级，无参无返
    :return: None
    '''
    s = int(input('请输入您的薪水：').strip())
    if s >= 30000:
        r = '属于金领'
    elif s >= 10000:
        r = '属于白领'
    elif s >= 2000:
        r = '属于蓝色'
    else:
        r = '需要努力！'
    print(r)


my_salary2()

# 5、    用递归函数my_money, 编程实现：月工资按天发放，第一天给你一分钱，然后，后一天是前一天的2倍，那么30天后工资为多少？
sep(5)
print('5、    用递归函数my_money, 编程实现')


def my_money(d):
    '''
    月工资按天发放，第一天给你一分钱，然后，后一天是前一天的2倍
    求第d天的工资
    :param d: 整数，第几天
    :return: float, 当天工资的元数
    '''
    if d <= 0:  # 为了健壮性
        return 0
    elif d == 1:   # 第一天
        return 0.01
    else:  # 然后，后一天是前一天的2倍
        return 2 * my_money(d - 1)


print(f'30天后工资为{my_money(1 + 30):,.2f}元')

# 6、    定义一个有参有返的函数circle，求一个圆柱体的体积，调用这个函数，求出底面半径为10，高为20的圆柱体的体积（底面积Ｘ高，面积S = π×(r2)，π取3
# .14）
sep(6)
print('6、    定义一个有参有返的函数circle，求一个圆柱体的体积')


def circle(r, h):
    '''
    求一个圆柱体的体积
    :param r: float, 底面半径
    :param h: float, 高
    :return: float,  体积
    '''
    return 3.14 * r * r * h


print(f'底面半径为10，高为20的圆柱体的体积 = {circle(10, 20)}')

# 7、    定义一个函数move(x), 参数x代表一个列表，实现列表中元素的循环移动：
# 例如这个列表是[1, 2, 3, 4, 5, 6, 7, 8, 9, 0], 要求将列表中的每个元素一次向前移动一个位置，第一个元素到列表的最后，然后输出这个列表。
# 最终样式是[2, 3, 4, 5, 6, 7, 8, 9, 0, 1]
sep(7)
print('7、    定义一个函数move(x), 参数x代表一个列表，实现列表中元素的循环移动')


def move(x):
    '''
    实现列表中元素的循环移动
    :param x: 一个列表
    :return: None
    '''
    x.append(x.pop(0))


x = list(range(1, 1 + 9)) + [0]
print(f'列表: {x}')
move(x)
print(f'移动后: {x}')

# 8、    定义并实现一个对序列元素排重的函数voidsame(x), 实现功能：输入任意一个序列，自动去除序列中的重复元素，并输出重复的元素个数。
# 例如调用voidsame(a) ，a = (49, 28, 12, 23, 23, 29,20, 23, 28, 16, 22, 23, 49, 16, 23, 49), 效果如下：
sep(8)
print('8、    定义并实现一个对序列元素排重的函数voidsame(x)')


def voidsame(x):
    '''
    输入任意一个序列，自动去除序列中的重复元素，并输出重复的元素个数
    :param x: 序列
    :return: 集合，排重后
    '''
    xlen = len(x)
    s = set(x)
    xlen2 = len(s)
    print(f'其中重复元素个数: {xlen - xlen2}\n排重后：{s!r}')
    return s


voidsame((49, 28, 12, 23, 23, 29,20, 23, 28, 16, 22, 23, 49, 16, 23, 49))

# 9、    定义一个函数words_rep(t), 实现指定词汇的替换功能。
# 1）首先让用户用键盘输入1个或多个词汇，存入列表wlist之中；
# 2）遍历列表中的每个词汇，将t中的每个词汇都替换成□
# 3）调用words_rep(txt)，txt =”从前有座山，山里有座庙，庙里有个老和尚，正在给小和尚讲故事！故事是什么呢？从前有座山，山里有座庙, 庙里有个老和尚”
# 效果示意如下：
sep(9)
print('9、    定义一个函数words_rep(t), 实现指定词汇的替换功能。')


def words_rep(t):
    '''
    指定词汇的替换功能
    1）首先让用户用键盘输入1个或多个词汇，存入列表wlist之中；
    2）遍历列表中的每个词汇，将t中的每个词汇都替换成□
    :param t: 字符串，源语句
    :return: 字符串，替换后语句
    '''
    wlist = []
    while True:
        w = input('请输入词汇，退出按0：')
        if '0' == w.strip():
            break
        wlist.append(w)
    for tgt in wlist:
        t = t.replace(tgt, '□')
    return t


txt = '从前有座山，山里有座庙，庙里有个老和尚，正在给小和尚讲故事！故事是什么呢？从前有座山，山里有座庙, 庙里有个老和尚'
print(words_rep(txt))

# 10. 定义一个函数，按下列要求的步骤，实现自动为用户选择彩票号码。（15分）
sep(10)
print('10. 定义一个函数，按下列要求的步骤，实现自动为用户选择彩票号码。（15分）')
import random


# （1）定义一个函数genReds(), 生成1 - 33之间的6个随机红球号码，并返回。
def genReds():
    '''
    生成1 - 33之间的6个随机红球号码，并返回
    :return: 列表，6个随机红球号码
    '''
    xnums = list(range(1, 1 + 33))
    return random.sample(xnums, k=6)


# （2）定义一个函数genBlue(), 返回1 - 16之间的1个随机号码作为蓝球号码。
def genBlue():
    '''
    返回1 - 16之间的1个随机号码作为蓝球号码
    :return: 整数，蓝球号码
    '''
    xnums = list(range(1, 1 + 16))
    return random.choice(xnums)


# （3）定义一个函数genBalls（），在这个函数内部调用genReds()和genBlue()，输出一个字典类型的数据如下：
# 你本次选择的号码是：{'红球': [], '蓝球': []，'注数': 1}
def genBalls():
    '''
    调用genReds()和genBlue()，输出一个字典类型的数据
    :return: set
    '''
    reds = genReds()
    blues = [genBlue()]
    return {'红球': reds, '蓝球': blues, '注数': 1}


# （4）定义函数menu()
# 显示界面如下：
def menu():
    print('''\
--------欢迎来到彩票中心--------
1. 自动生成红球
2. 自动生成蓝球
3. 查看号码信息
4. 退出系统
-----------------------------
输入你的选项：''')


# （5）根据用户选择项目，分别调用相应函数，从而实现相应功能。
while True:
    menu()
    d = int(input(''))
    if 1 == d:
        print(f'生成的红球是：{genReds()}')
    elif 2 == d:
        print(f'生成的蓝球是：{genBlue()}')
    elif 3 == d:
        print(f'号码信息: {genBalls()}')
    elif 4 == d:
        print('欢迎再来！')
        break
    else:
        print('输入有误！')